#ifndef DELIVER_H_
#define DELIVER_H_

#include <string>
#include <mutex>
#include <condition_variable>

/**
 * @namespace FLAG
 * @brief 命名空间FLAG用于封装与通信相关的常量
 */
namespace FLAG
{
    /**
     * @brief 仅发送数据的标志
     */
    const int OnlySend = 0x1;
    
    /**
     * @brief 发送和接收数据的标志
     */
    const int SendAndReceived = 0x2;
}

/**
 * @struct Reply
 * @brief 结构体，用于存储回复的数据和大小。
 */
typedef struct
{
    const char *data; ///< 回复的数据指针
    int size;         ///< 回复的数据大小
} Reply;

/**
 * @class Deliver
 * @brief 类，用于处理消息的投递。
 */
class Deliver
{
public:
    /**
     * @brief 构造函数，初始化Deliver对象。
     * @param app_name 应用名称
     * @param sub_name 订阅名称
     * @param data 数据指针
     * @param size 数据大小
     * @param flag 标志
     */
    Deliver(const std::string &app_name, const std::string &sub_name, const char *data, int size, int flag);

    /**
     * @brief 析构函数，释放Deliver对象。
     */
    virtual ~Deliver();

    /**
     * @brief 获取应用名称。
     * @return 应用名称
     */
    std::string appName() const;

    /**
     * @brief 获取订阅名称。
     * @return 订阅名称
     */
    std::string subName() const;

    /**
     * @brief 获取数据指针。
     * @return 数据指针
     */
    const char *data() const;

    /**
     * @brief 获取数据大小。
     * @return 数据大小
     */
    int size() const;

    /**
     * @brief 获取标志。
     * @return 标志
     */
    int flag() const;

    /**
     * @brief 获取回复。
     * @return 回复指针
     */
    Reply *reply();

    /**
     * @brief 检查是否已回复。
     * @return 是否已回复
     */
    bool isReplied();

    /**
     * @brief 设置回复状态。
     * @param replied 回复状态
     */
    void setReplied(bool replied);

    /**
     * @brief 获取互斥锁。
     * @return 互斥锁指针
     */
    std::mutex *mutex();

    /**
     * @brief 获取条件变量。
     * @return 条件变量指针
     */
    std::condition_variable *cond();

private:
    std::string app_name_;         ///< 应用名称
    std::string sub_name_;         ///< 订阅名称
    const char *data_;             ///< 数据指针
    int size_;                     ///< 数据大小
    int flag_;                     ///< 标志
    Reply reply_;                  ///< 回复
    bool is_reply_;                ///< 是否已回复
    std::mutex mutex_;             ///< 互斥锁，用于线程同步
    std::condition_variable cond_; ///< 条件变量，用于线程通信
};

#endif